/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../data_struct/head.h"
#include "../macro/head.h"
#include "ssl_impl.h"
#include "rsa_impl.h"
#include "des_impl.h"
#include "ssl_mgr.h"
#include "rsa_mgr.h"
#include "hook.h"
#include "mgr.h"

namespace xos_encrypt
{

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    static xos_container::i_container * container_ptr = 0;
    static xos_box::i_str_property * ssl_ctx_prop_ptr = 0;
    static mgr * mgr_ptr = 0;

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    mgr::mgr()
    {
        init_data();
    }

    mgr::~mgr()
    {}

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int mgr::static_init( xos_container::i_container * pContainer, i_encrypt_mgr ** ppv )
    {
        return xos_stl::static_init_module( pContainer, ppv, container_ptr, mgr_ptr );
    }

    xos_box::i_str_property * mgr::ssl_ctx_prop()
    {
        return ssl_ctx_prop_ptr;
    }

    xos_container::i_container * mgr::container()
    {
        return container_ptr;
    }

    mgr * mgr::get()
    {
        return mgr_ptr;
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int mgr::set_ssl_ctx_prop( xos_box::i_str_property * pProp )
    {
        int ret = 0;
        ssl_ctx_prop_ptr = pProp;
        return ret;
    }

    i_ssl_mgr* mgr::ssl()
    {
        ssl_mgr::T* pT = 0;
        xos_stl::init_pool_item( pT );
        return pT;
    }

    i_rsa_mgr* mgr::rsa()
    {
        rsa_mgr::T* pT = 0;
        xos_stl::init_pool_item( pT );
        return pT;
    }

    i_des* mgr::des()
    {
        des_impl::T* pT = 0;
        xos_stl::init_pool_item( pT );
        return pT;
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int mgr::put_back_to_pool()
    {
        int ret = 0;
        delete this;
        return ret;
    }

    int mgr::init_data()
    {
        int ret = 0;
        return ret;
    }

    int mgr::init()
    {
        int ret = 0;

        if( 0 == ret )
        {
            int r = OPENSSL_init_ssl( OPENSSL_INIT_LOAD_CONFIG, NULL );
            if( 0 == r )
            {
                LOG4( "openssl init failed" );
                ret = 1;
            }
            else
            {
                ERR_clear_error();
            }
        }

        if( 0 == ret )
        {
            ret = hook::init();
        }

        return ret;
    }

    int mgr::term()
    {
        int ret = 0;

        {
            hook::term();
        }
        {
            mgr_ptr = 0;
            container_ptr = 0;
        }
        {
            ERR_free_strings();            //for ERR
            EVP_cleanup();                 //For EVP
            CRYPTO_cleanup_all_ex_data();  //generic
            OPENSSL_cleanup();
        }

        return ret;
    }

} // xos_encrypt
